#ifndef _MD5_H
#define _MD5_H

//#pragma warning(disable:4786)

#include <string>
#include <cstring>
using namespace std;

#define AUTHFILE "../cfg/auth.json"

struct MD5_DATA
{
    unsigned long data[4];
    bool operator<(const MD5_DATA &p) const
    {
        return memcmp(data, p.data, 4 * sizeof(long)) > 0;
    }
};

class CMD5
{
  private:
#define md5_uint8 unsigned char
#define md5_uint32 unsigned long int

    struct md5_context
    {
        md5_uint32 total[2];
        md5_uint32 state[4];
        md5_uint8 buffer[64];
    };

    void md5_starts(struct md5_context *ctx);
    void md5_process(struct md5_context *ctx, const md5_uint8 data[64]);
    void md5_update(struct md5_context *ctx, const md5_uint8 *input, size_t length);
    void md5_finish(struct md5_context *ctx, md5_uint8 digest[16]);

  public:
    //! construct a CMD5 from any buffer
    void GenerateMD5(const md5_uint8 *buffer, size_t bufferlen);

    //! construct a CMD5
    CMD5();

    //! construct a md5src from char *
    CMD5(const char *md5src);

    //! construct a CMD5 from a 16 bytes md5
    CMD5(unsigned long *md5src);

    //! add a other md5
    CMD5 operator+(CMD5 adder);

    //! just if equal
    bool operator==(CMD5 cmper);

    //! give the value from equer
    // void operator =(CMD5 equer);

    //! to a string
    string ToString();

    unsigned long m_data[4];
};
#endif /* md5.h */